﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Bussiness;
using Data;

namespace hostal
{
    public partial class RegistrarConReserva : Form
    {
        public string numeroHabitacion, fechaLlegada, numeroDocumentoReserva,numeroDocumento, fechaRegistro, fechaRegistroActual, fechaSalida;
        bool registro = false;
        manejadorFechas fechas = new manejadorFechas();
        public List<string> coleccionHabitacionesReservadas = new List<string>();
        public List<string> coleccionHabitacionesRegistradas = new List<string>();
        public List<bool> coleccionHabitacionesEditadas = new List<bool>();

        private bool click = false;
        bool fechaIngresoIncorrecto, fechaSalidaIncorrecto = true;
        bool nuevo = false;
        private manejadorReservas habitacionesDisponibles = new manejadorReservas();
        public List<string> coleccionHabitacionesDisponibles { get; set; }
        public List<string> coleccionCapacidadHabitacionesDisponibles { get; set; }
        public List<string> coleccionHabitaciones { get; set; }

        public int indice { get; set; }
        public DataTable dataTableTemporal { get; set; }

        public RegistrarConReserva(string numeroDocumento, string fechaLlegada, string fechaSalida, string fechaRegistro, DataTable dt)
        {
            InitializeComponent();
            this.numeroDocumentoReserva = numeroDocumento;
            this.fechaLlegada = fechaLlegada;
            this.fechaRegistro = fechaRegistro;
            this.fechaSalida = fechaSalida;
            fechaRegistroActual = fechas.crearFechaActual();
            //fechaSalida = dt.Rows[0]["fechaSalida"].ToString();

            DGReservas.Columns.Add("numeroHabitacion", "numero habitacion");
            DGReservas.Columns.Add("capacidad", "Capacidad");

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                DGReservas.Rows.Add(dt.Rows[i]["numeroHabitacion"],dt.Rows[i]["capacidad"]);
                ReservasDataAccess cancelarReserva = new ReservasDataAccess();
                numeroHabitacion = DGReservas.Rows[i].Cells["numeroHabitacion"].Value.ToString();
                cancelarReserva.cancelarReserva(numeroHabitacion, numeroDocumento, fechaLlegada);
                coleccionHabitacionesReservadas.Add(numeroHabitacion);
                coleccionHabitacionesEditadas.Add(false);
            }

            DGHabitacionesRegistradas.Columns.Add("numero", "numero habitacion");
            DGHabitacionesRegistradas.Columns.Add("tipo", "tipo");
            DGHabitacionesRegistradas.Columns.Add("capacidad", "capacidad");

            DataGridViewButtonColumn cancelarRegistro = new DataGridViewButtonColumn();
            cancelarRegistro.DataPropertyName = "cancelarRegistro";
            cancelarRegistro.HeaderText = "Cancelar Registro";
            DGHabitacionesRegistradas.Columns.Add(cancelarRegistro);

            DGHabitacionesDisponibles.Columns.Add("numero", "numero habitacion");
            DGHabitacionesDisponibles.Columns.Add("tipo", "tipo");
            DGHabitacionesDisponibles.Columns.Add("capacidad", "capacidad");

            DGCliente.Columns.Add("numeroDocumento", "numero documento");
            DGCliente.Columns.Add("nombre", "nombre");
            DGCliente.Columns.Add("apellido", "apellido");

            habitacionDataAccess habitaciones = new habitacionDataAccess();
            dataTableTemporal = habitaciones.buscartipoHabitaciones();
            dg.DataSource = dataTableTemporal;
            for (int i = 0; i < dg.RowCount; i++)
            {
                CBTipoHabitacion.Items.Add(dg.Rows[i].Cells["tipo"].Value);
            }

            dataTableTemporal = habitaciones.obtenerTipoHabitacion(numeroHabitacion);
            CBTipoHabitacion.Text = dataTableTemporal.Rows[0][0].ToString();

            DTFechaIngreso.Text = fechaLlegada;
            DTFechaSalida.Text = fechaSalida;

        }

        private void BTRegistrar_Click(object sender, EventArgs e)
        {
            if (fechaIngresoIncorrecto = DTFechaIngreso.Value != System.DateTime.Today.Date)
                EPFechaIngreso.SetError(DTFechaIngreso, "La fecha de ingreso no puede ser distinta a la actual");
            else
                EPFechaIngreso.Clear();
            if (fechaSalidaIncorrecto = DTFechaIngreso.Value > DTFechaSalida.Value)
                EPFechaSalida.SetError(DTFechaSalida, "La fecha de salida no puede ser menor a la ingreso");
            else
                EPFechaSalida.Clear();
            if (!fechaSalidaIncorrecto && !fechaIngresoIncorrecto)
            {
                HospedajeDataAccess hospedaje = new HospedajeDataAccess();
                try
                {
                    int fila;
                    fila = DGCliente.CurrentRow.Index;

                    fila = DGHabitacionesDisponibles.CurrentRow.Index;
                    numeroHabitacion = DGHabitacionesDisponibles.Rows[fila].Cells["numero"].Value.ToString();
                    for (int i = 0; i < DGCliente.Rows.Count; i++)
                    {
                        numeroDocumento = DGCliente.Rows[i].Cells["numeroDocumento"].Value.ToString();
                        if (!hospedaje.existeHospedaje(numeroDocumento, numeroHabitacion, DTFechaIngreso.Text, fechaRegistro))
                            hospedaje.registrarHospedaje(numeroDocumento, numeroHabitacion, DTFechaIngreso.Text, DTFechaSalida.Text, fechaRegistro);
                        else
                            hospedaje.activarHospedaje(numeroDocumento, numeroHabitacion, DTFechaIngreso.Text, DTFechaSalida.Text, fechaRegistro, fechaRegistro);
                    }
                    MessageBox.Show("Exito Al Registrar");
                    if (!nuevo)
                    {
                        //DialogResult = DialogResult.OK;
                        try
                        {
                            DGHabitacionesRegistradas.Rows.Add(DGHabitacionesDisponibles.CurrentRow.Cells["numero"].Value.ToString(), DGHabitacionesDisponibles.CurrentRow.Cells["tipo"].Value.ToString(), DGHabitacionesDisponibles.CurrentRow.Cells["capacidad"].Value.ToString(),new Button().Text="cancelar");
                            DGHabitacionesDisponibles.Rows.Remove(DGHabitacionesDisponibles.CurrentRow);
                        }
                        catch (Exception exp) { }

                        for (int i = 0; i < DGCliente.RowCount; )
                        {
                            DGCliente.Rows.Remove(DGCliente.Rows[0]);
                        }

                        registro = true;

                    }
                    //this.Close();
                }
                catch (SystemException exeption)
                {
                    if (DGCliente.Rows.Count == 0)
                        MessageBox.Show("Debe existir al menos una persona parta registrar");
                    else
                        MessageBox.Show("No se Registro Con Exito");
                }
            }
        }
        private void registrar(string fechaLlegada, string numeroDocumento, string numeroHabitacion, string fechaSalida, List<string> coleccionHabitaciones)
        {
            this.numeroDocumentoReserva = numeroDocumento;
            this.numeroHabitacion = numeroHabitacion;
            this.fechaRegistro = fechas.crearFechaActual();
            this.coleccionHabitaciones = coleccionHabitaciones;
            this.fechaLlegada = fechaLlegada;
            this.fechaSalida = fechaSalida;
            fechaRegistroActual = fechas.crearFechaActual();

            DTFechaIngreso.Text = fechaLlegada;
            DTFechaSalida.Text = fechaSalida;

            llenarGridHabitacionesDisponibles2(fechaLlegada, fechaSalida);

            DGHabitacionesDisponibles.ClearSelection();
            for (int i = 0; i < DGHabitacionesDisponibles.Rows.Count; i++)
            {
                if (DGHabitacionesDisponibles.Rows[i].Cells["numero"].Value.ToString() == numeroHabitacion)
                    DGHabitacionesDisponibles.Rows[i].Cells["numero"].Selected = true;
            }
        }

        private void llenarGridHabitacionesDisponibles2(string fechaIngreso, string fechaSalida)
        {
            coleccionHabitacionesDisponibles = habitacionesDisponibles.obtenerHabitacionesDisponibles(fechaIngreso, fechaSalida, CBTipoHabitacion.Text);
            coleccionCapacidadHabitacionesDisponibles = habitacionesDisponibles.obtenerCapacidadHabitacionesDisponibles(fechaIngreso, fechaSalida, CBTipoHabitacion.Text);

            for (int i = 0; i < DGHabitacionesDisponibles.Rows.Count; )
            {
                DGHabitacionesDisponibles.Rows.Remove(DGHabitacionesDisponibles.Rows[0]);
            }
            for (int i = 0; i < coleccionHabitacionesDisponibles.Count(); i++)
            {
                //if (/*!coleccionHabitaciones.Contains(coleccionHabitacionesDisponibles[i]) || */coleccionHabitacionesDisponibles[i] == numeroHabitacion)
                    DGHabitacionesDisponibles.Rows.Add(coleccionHabitacionesDisponibles[i], CBTipoHabitacion.Text, coleccionCapacidadHabitacionesDisponibles[i]);
            }
        }

        private void BTAtras_Click(object sender, EventArgs e)
        {
            try
            {
                for (int i = 0; i < DGHabitacionesRegistradas.RowCount; i++)
                {
                    numeroHabitacion = DGHabitacionesRegistradas.Rows[i].Cells["numero"].Value.ToString();
                    HospedajeDataAccess habilitarHospedaje = new HospedajeDataAccess();
                    habilitarHospedaje.cancelarHospedajeNumeroHabitacion(numeroHabitacion);
                }
            }
            catch (Exception exp) { }
            registro = false;
            this.Close();
        }

        private void RegistrarConReserva_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                if (!registro)
                {
                    for (int i = 0; i < DGReservas.Rows.Count; i++)
                    {
                        numeroHabitacion = DGReservas.Rows[i].Cells["numeroHabitacion"].Value.ToString();
                        ReservasDataAccess habilitarReserva = new ReservasDataAccess();
                        habilitarReserva.habilitarReserva(numeroHabitacion, numeroDocumentoReserva, fechaLlegada);
                    }
                }
            }
            catch (Exception exp) { }
        }

        private void BTBuscarCliente_Click(object sender, EventArgs e)
        {
            BuscarClienteReserva buscarClienteReserva = new BuscarClienteReserva();
            bool registrar = false;
            if (buscarClienteReserva.ShowDialog() == DialogResult.OK)
            {
                for (int i = 0; i < DGCliente.Rows.Count; i++)
                {
                    if (registrar = DGCliente.Rows[i].Cells["numeroDocumento"].Value.ToString() == buscarClienteReserva.numeroDocumento)
                        i = DGCliente.Rows.Count;
                }
                if (!registrar)
                    DGCliente.Rows.Add(buscarClienteReserva.numeroDocumento, buscarClienteReserva.nombre, buscarClienteReserva.apellido);
            }
        }

        private void BTAgregarHuesped_Click(object sender, EventArgs e)
        {
            registarCliente registrarClienteReserva = new registarCliente();
            registrarClienteReserva.ShowDialog();
        }

        private void BTEliminarHuesped_Click(object sender, EventArgs e)
        {
            try
            {
                DGCliente.Rows.Remove(DGCliente.CurrentRow);
            }
            catch (Exception exp) { }
        }

        private void TBBuscarHabitacionesDisponibles_Click(object sender, EventArgs e)
        {
            if (DTFechaIngreso.Value.Date <= DTFechaSalida.Value.Date)
            {
                if (nuevo)
                    llenarGridHabitacionesDisponibles(DTFechaIngreso.Text, DTFechaSalida.Text);
                else
                    llenarGridHabitacionesDisponibles2(DTFechaIngreso.Text, DTFechaSalida.Text);
            }
        }

        private void llenarGridHabitacionesDisponibles(string fechaIngreso, string fechaSalida)
        {
            coleccionHabitacionesDisponibles = habitacionesDisponibles.obtenerHabitacionesDisponibles(fechaIngreso, fechaSalida, CBTipoHabitacion.Text);
            coleccionCapacidadHabitacionesDisponibles = habitacionesDisponibles.obtenerCapacidadHabitacionesDisponibles(fechaIngreso, fechaSalida, CBTipoHabitacion.Text);

            for (int i = 0; i < DGHabitacionesDisponibles.Rows.Count; )
            {
                DGHabitacionesDisponibles.Rows.Remove(DGHabitacionesDisponibles.Rows[0]);
            }
            for (int i = 0; i < coleccionHabitacionesDisponibles.Count(); i++)
            {
                DGHabitacionesDisponibles.Rows.Add(coleccionHabitacionesDisponibles[i], CBTipoHabitacion.Text, coleccionCapacidadHabitacionesDisponibles[i]);
            }
        }

        private void DTFechaIngreso_CloseUp(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void DTFechaSalida_CloseUp(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void CBTipoHabitacion_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = true;
        }

        private void CBTipoHabitacion_SelectionChangeCommitted(object sender, EventArgs e)
        {
            click = true;
        }

        private void CBTipoHabitacion_SelectedValueChanged(object sender, EventArgs e)
        {
            if (click)
                TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void BTFinalizar_Click(object sender, EventArgs e)
        {
            registro = true;
            this.Close();
        }

        private void DGHabitacionesRegistradas_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if(DGHabitacionesRegistradas.CurrentCell.ColumnIndex.Equals(3))
            {
                HospedajeDataAccess cancelarReserva = new HospedajeDataAccess();
                cancelarReserva.cancelarHospedajeNumeroHabitacion(DGHabitacionesRegistradas.CurrentRow.Cells["numero"].Value.ToString());

                try
                {
                    if (habitacionesDisponibles.estaHabitacionDisponible(DGHabitacionesRegistradas.CurrentRow.Cells["numero"].Value.ToString()))
                    {
                        DGHabitacionesDisponibles.Rows.Add(DGHabitacionesRegistradas.CurrentRow.Cells["numero"].Value.ToString(), DGHabitacionesRegistradas.CurrentRow.Cells["tipo"].Value.ToString(), DGHabitacionesRegistradas.CurrentRow.Cells["capacidad"].Value.ToString());
                    }
                    DGHabitacionesRegistradas.Rows.Remove(DGHabitacionesRegistradas.CurrentRow);
                    TBBuscarHabitacionesDisponibles_Click(sender, e);
                }
                catch (Exception exp) { }
            }
        }

        private void DTFechaSalida_ValueChanged(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void DTFechaIngreso_ValueChanged(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }
    }
}
